/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ch.fhnw.swa.aufgabenverwaltungswa.business;

import ch.fhnw.swa.aufgabenverwaltungswa.persistenz.Aufgabe;
import ch.fhnw.swa.aufgabenverwaltungswa.persistenz.Mitarbeiter;
import ch.fhnw.swa.aufgabenverwaltungswa.webservice.GetERPEmployee;
import ch.fhnw.swa.aufgabenverwaltungswa.webservice.Mitarbeitererp;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.GenericType;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 * Diese Klasse verwaltet die Datenbankzugriffe und den Webservicezugriff fuer die Mitarbeiter
 * @author Tobias Neuenschwander
 * @author Benjamin Schatzmann
 * @author Edis Dilji
 * @author Francis Murillo
 */
@Stateless
public class MitarbeiterbearbeitungEJB {
    //**************************************************************************
    //Variablen
    //**************************************************************************
    @PersistenceContext(name = "ch.fhnw.swa_AufgabenverwaltungSWA_war_1.0-SNAPSHOTPU")
    private EntityManager em;
    
    //**************************************************************************
    //Methoden
    //**************************************************************************
    /**
     * Diese Methode hohlt alle Aufgaben aus der Datenbank und gibt sie als List zurueck
     * @return Liste aller Aufgaben
     */
    public List<Aufgabe> getTaskList(){
        List<Aufgabe> reList = em.createNamedQuery("findAllTask", Aufgabe.class).getResultList();
        return reList;
     }

    /**
     * Diese Methode Methode hohlt die Aufgaben, deren Ids uebergene wurden aus der
     * Datenbank und gibt sie als ArrayList zurueck
     * @param taskIds ArrayList von String mit den Ids der zu hohlenden Aufgaben
     * @return ArrayList von Aufgaben, deren Ids uebergeben wurden
     */
    private ArrayList<Aufgabe> getTaskListFromIds(ArrayList<String> taskIds){
        ArrayList<Aufgabe> newList = new ArrayList<Aufgabe>();
        
        for (String sId : taskIds){
            //ID in Long parsen
            Long mId = Long.parseLong(sId);
            //Aufgabe aus der Datenbank hohlen und in die ArrayList speichern
            newList.add(em.find(Aufgabe.class, mId));
        }
        
        return (newList);
    }
    
    /**
     * Diese Methode speichert den uebergeben Mitaebeiter in der Datenbank
     * @param ma zu speichernder Mitarbeiter
     * @param taskIds Ids der dem Mitarbeiter zugeteilten Aufgaben
     */
    public void saveEmployee(Mitarbeiter ma, ArrayList<String> taskIds){
        //Aus der String ArrayList mit Ids die Aufgaben hohlen und dem Mitarbeiter hinzufuegen
        ma.setAufgabenZugeteilt(getTaskListFromIds(taskIds));
        //Mitarbeiter in der Datenbank speichern
        em.merge(ma);
    }
    
    /**
     * Diese Methode speichert die Daten des uebergebenen Mitarbeiter aus dem ERP-System
     * in einen Mitarbeiter
     * @param ma Mitarbeiter aus dem ERP-System
     * @return Mitarbeiter
     */
    private Mitarbeiter convertMaERP(Mitarbeitererp ma){
        Mitarbeiter reMa = new Mitarbeiter();
        
        reMa.setId(ma.getId().longValue());
        reMa.setVorname(ma.getVorname());
        reMa.setNachname(ma.getNachname());
        reMa.setRolle(ma.getRolle());
        reMa.setAbteilung(ma.getAbteilung());
        reMa.setAdressePrivat(ma.getAdresseprivat());
        reMa.setAdresseGeschaeft(ma.getAdressegeschaeft());
        reMa.setTelHandy(ma.getTelefonhandy());
        reMa.setTelFestnetz(ma.getTelefonfestnetz());
        reMa.setEmailPrivat(ma.getEmailprivat());
        reMa.setEmailGeschaeft(ma.getEmailgeschaeft());
        reMa.setWebseite(ma.getWebseite());
        
        return(reMa);
    }
    
    /**
     * Diese Methode hohlt alle Mitarbeiter aus dem ERP-System ueber einen Webservice
     * @return ArrayList mit allen Mitarbeitern
     */
    public ArrayList<Mitarbeiter> getEmployeeListWS(){
        ArrayList<Mitarbeiter> reList = new ArrayList<Mitarbeiter>();
        //Mitarbeiter aus dem ERP-System hohlen
        GetERPEmployee erpClient = new GetERPEmployee();
        ClientResponse response = erpClient.findAll_XML(ClientResponse.class);
        GenericType<List<Mitarbeitererp>> genericType = new GenericType<List<Mitarbeitererp>>() {};
        List<Mitarbeitererp> data =(response.getEntity(genericType));
        
        //Daten in Mitarbeiterobjekte speichern
        if(data != null){
            for( Mitarbeitererp ma : data ){
               reList.add(convertMaERP(ma));
            }
        }
        
        return(reList);
    }
    
    /**
     * Diese Methode hohlt den Mitarbeiter, dessen Id uebergeben wurde, aus dem ERP-System
     * @param mId Id des zu hohlenden Mitarbeiters
     * @return Mitarbeiter, dessen id uebergeben wurde
     */
    public Mitarbeiter getEmployeeWS(String mId){
        Mitarbeiter reMa;
        //Mitarbeiter aus dem ERP-System ueber den Webservice hohlen und in ein Mitarbeiterobjekt specihern
        GetERPEmployee erpClient = new GetERPEmployee();
        ClientResponse response = erpClient.find_XML(ClientResponse.class, mId);
        reMa = convertMaERP(response.getEntity(Mitarbeitererp.class));
        
        return(reMa);
    }
    
    /**
     * Diese Methode hohlt alle Mitarbeiter aus der Datenbank und gibt sie als List zurueck
     * @return Liste mit allen Mitarbeitern
     */
    public List<Mitarbeiter> loadEmployeeList (){
        List<Mitarbeiter> reList = em.createNamedQuery("findAllEmployee", Mitarbeiter.class).getResultList();
        return reList;
     }
    
    /**
     * Diese Methode loesch den Mitarbeiter, dessen Id uebergeben wurde, aus der Datenebank
     * @param maIdToDel Id des zu loeschenden Mitarbeiters
     */
    public void deleteEmployee(Long maIdToDel){
        //Mitarbeiter ueber id aus der Datenbank hohlen und loeschen
        em.remove(findEmployeeById(maIdToDel));
    }
    
    /**
     * Diese Methode hohlt den Mitarbeiter, dessen Id uebergeben wurde, aus der Datenbank
     * @param idToFind Id des Mitarbeiter, der aus der Datenbank gehohlt werden soll
     * @return Mitarbeiter, von welchem die Id uebergeben worden ist
     */
    public Mitarbeiter findEmployeeById (Long idToFind){
        return (em.find(Mitarbeiter.class, idToFind));
    }
}
